import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { logout, getCurrentUser } from '@/api/user.js'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'

export const useUserStore = defineStore('user', () => {
  const router = useRouter()

  // 用户信息（存储完整用户对象，不含密码）
  const userInfo = ref(null)
  // 登录令牌（JWT）
  const token = ref('')
  // 是否已登录（计算属性：token存在即视为登录）
  const isLoggedIn = computed(() => !!token.value)
  // 是否为管理员（计算属性：角色为ADMIN即视为管理员）
  const isAdmin = computed(() => {
    return userInfo.value && userInfo.value.userRole 
      ? userInfo.value.userRole.toUpperCase() === 'ADMIN' 
      : false
  })

  /**
   * 初始化用户状态：从localStorage加载数据
   */
  const initUserState = () => {
    const storedUser = localStorage.getItem('userInfo')
    const storedToken = localStorage.getItem('token')

    if (storedUser && storedToken) {
      try {
        userInfo.value = JSON.parse(storedUser)
        token.value = storedToken
        console.log('用户状态初始化成功:', userInfo.value)
      } catch (error) {
        console.error('解析用户信息失败:', error)
        clearUserState()
      }
    } else {
      console.log('无本地存储的用户信息，状态初始化失败')
    }
  }

  /**
   * 设置用户状态：登录成功后调用
   * @param {string} tokenStr - 登录接口返回的token
   * @param {Object} userData - 用户信息（getCurrentUser接口返回）
   * @param {boolean} [rememberMe=false] - 是否记住登录状态（当前统一用localStorage）
   */
  const setUserState = (tokenStr, userData, rememberMe = false) => {
    userInfo.value = userData
    token.value = tokenStr

    // 存储到localStorage（永久存储，除非手动清除）
    localStorage.setItem('userInfo', JSON.stringify(userData))
    localStorage.setItem('token', tokenStr)
    console.log('用户状态设置成功:', userData.userName)
  }

  /**
   * 清除用户状态：注销/退出登录时调用
   */
  const clearUserState = () => {
    userInfo.value = null
    token.value = ''
    localStorage.removeItem('userInfo')
    localStorage.removeItem('token')
    console.log('用户状态已清除')
  }

  /**
   * 用户注销：调用后端注销接口+清除前端状态
   */
  const userLogout = async () => {
    try {
      if (token.value) {
        await logout() // 调用后端注销接口
      }
      clearUserState()
      ElMessage.success('注销成功')
      router.push('/login')
    } catch (error) {
      console.error('注销接口调用失败:', error)
      // 即使后端失败，强制清除前端状态
      clearUserState()
      ElMessage.warning('注销失败，但已退出登录')
      router.push('/login')
    }
  }

  /**
   * 刷新用户信息：重新从后端获取最新用户数据
   * @returns {boolean} - 刷新成功返回true，失败返回false
   */
  const refreshUserInfo = async () => {
    try {
      if (!token.value) return false

      const res = await getCurrentUser()
      userInfo.value = res.data
      // 更新本地存储的用户信息
      localStorage.setItem('userInfo', JSON.stringify(res.data))
      console.log('用户信息刷新成功')
      return true
    } catch (error) {
      console.error('刷新用户信息失败:', error)
      clearUserState()
      return false
    }
  }

  return {
    userInfo,
    token,
    isLoggedIn,
    isAdmin,
    initUserState,
    setUserState,
    clearUserState,
    logout: userLogout,
    refreshUserInfo
  }
})